エラー処理


エラー処理の概要
実行時エラーが発生すると、通常はその時点でプロシージャの処理が止まってしまいます。VBAでは、実行時エラーが発生したときに、それを適切に処理するためのプログラムを入れることができるようになっています。これをエラートラップ(Error
Trap)と呼び、下記の 2 つの方法があります。
1 エラー発生時の動作指定
ステートメント |
動 作 |
On Error Resume Next |
実行時エラーが発生してもプログラムを中断せず、エラーが発生した箇所の次の処理から継続して実行します。
通常、エラーの発生が予想されるところのすぐ後ろにエラー処理を記述しておく方法です。 |
On Error GoTo <line> |
On Errorステートメントと同じプロシージャ内に存在する引数
line で指定した行(任意の行ラベルまたは行番号)から始まるエラー処理ルーチンを実行します。
エラーが発生したときのジャンプ先を予め決めておき、エラー処理を一括して行う方法です。
エラーの発生時以外にエラー処理ルーチンが実行されないようにするには、そのエラー処理ルーチンの直前に Exit
Sub (ファンクション・プロシージャの場合は、Exit Function)ステートメントを配置してプロシージャを終了します。
<line>に 0
を指定するとエラートラップを無効にします。 |
どちらもプロシージャの先頭にステートメントを記述しておきます。 |
2 エラー処理ルーチンからの戻り先の指定
ステートメント |
動 作 |
Resume |
エラーの原因となった行からプログラムの実行が再開されます。 |
Resume Next |
エラーの原因となった行の次からプログラムの実行が再開されます。 |
Resume <line> |
引数 line に指定した行(行ラベルまたは行番号)からプログラムの実行が再開されます。 |
エラー処理実行後の戻り先は、エラー処理ルーチンの最後に指定し、戻り先の位置(行)はエラー処理ルーチンと同じプロシージャ内にある必要があります。 |
3 エラーの内容を調べる
エラーが発生したときに、その内容を調べるには、「Error」関数と「Err」オブジェクトがあります。
(1) Error 関数
指定したエラー番号に対応するエラー メッセージを返します。
[ Error 関数の構文 ]
Error(エラー番号)
[ 例1:エラー番号をに対応するエラーメッセージをメッセージボックスに表示 ]
MsgBox Error(11) ' 「0 で除算しました」を表示
(2) Err オブジェクト
エラー内容の情報をプロパティで参照します。プロパティの種類と内容は下表のとおりです。
[ Err オブジェクトの構文 ]
Err.<プロパティ>
[ 例1:エラー内容をメッセージボックスに表示 ]
On Error Resume Next
Error 11 'エラーステートメントで「 0 除算エラー」を発生させる
MsgBox "エラー内容:" & Err.Description ' 「エラー内容:0 で除算しました」を表示
Err オブジェクトに使用するプロパティと参照内容
プロパティ |
参 照 内 容 |
Description |
エラーの説明の文字列を設定します。値の取得も可能です。 |
Number |
エラー番号を設定します。Err オブジェクトの既定プロパティです。値の取得も可能です。 |
HelpContext |
ヘルプファイルのトピックに対応するコンテキスト番号を含む文字列式を設定します。値の取得も可能です。 |
HelpFile |
ヘルプファイルへの絶対バスを含む文字列式を設定します。値の取得も可能です。 |
Source |
エラーの発生元のオブジェクトまたはアプリケーションの名前を示す文字列式を設定します。値の取得も可能です。 |
LastDLLError |
最後にダイナミック リンク ライブラリ (DLL) を呼び出したときのエラーコードを返します。値の取得のみ可能です。 |


On Error Resume Next
処理内容:エラー発生行の次の行から処理を継続します
Sub error_1()
On Error Resume Next
' <通常の処理>
Error 11 '「 0 除算エラー」を発生させる
If Err.Number = 11 Then
MsgBox "エラーが発生したときの処理"
Err.Clear '
エラーメッセージのリセット
End If
' <通常の処理>
End Sub
処理内容:エラーが発生しても無視して次の行を実行します
Sub error_2()
On Error Resume Next
Sheets("Sheet1").Select
ActiveWorkbook.Value = 100 'エラーを発生させる
MsgBox "エラーの次の行です。"
Err.Clear '
エラーメッセージのリセット
End Sub


On Error GoTo
処理内容:エラー番号とエラー内容を表示します
Sub error_3()
On Error GoTo ErrorTrap
Ans = 100 / 0 '「 0 除算エラー」を発生させる
MsgBox "エラーの次の行です。"
Exit Sub ' プロシージャを抜け出る。
ErrorTrap:
MsgBox "エラー番号:" & Err.Number & vbCrLf & _
"エラー内容: " & Err.Description
Resume Next '
エラー発生行の次から実行
End Sub
処理内容:エラートラップを指定(エラー発生行から再実行)します
Sub error_4()
On Error GoTo ErrorTrap
Msg = "2 桁の数値を入力してください。"&
vbCrLf & _
"0 を入力するとエラーが発生します"
A = 100 / Application.InputBox(Prompt:=Msg, Title:="エラー処理",
Type:=1)
MsgBox "答えは " & Num & " です。"
Exit Sub ' プロシージャを抜け出る。
ErrorTrap:
MsgBox "エラー内容:" & Err.Description
& vbCrLf & _
"1から99までの数値を入力してください。"
Resume '
エラー発生行から実行
End Sub
処理内容:エラートラップを指定(指定行またはラベルから再実行)します
Sub error_5()
On Error GoTo ErrorTrap
ErrFlag = 0
Retry: ' エラー時にここから再度実行
If ErrFlag = 0 Then
N = Val(InputBox("100を任意の数値で除算します。" & _
vbCrLf & "0 (ゼロ)を入力するとエラーが発生します。"))
Else
N = Val(InputBox("1から99までの数値を入力してください。"))
End If
Ans = Int(100 / N) '入力結果が0のとき「ErrorTrap:」へ
MsgBox "100を" & N & "で除算した結果= " & Int(Ans)
Exit Sub ' プロシージャを抜け出る。
ErrorTrap:
MsgBox "エラールーチンの中です。再実行します。"
ErrFlag = 1
Resume Retry ' ラベル「Retry:」へジャンプする。
End Sub

